package yxxy.c_019.Semaphore;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Semaphore;

public class SemaphoreExample6 {
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    // 同步关键类，构造方法传入的数字是多少，则同一个时刻，只运行多少个进程同时运行制定代码
    private Semaphore semaphore = new Semaphore(2);

    public void doSomething(){
        try {
            /**
             * 在 semaphore.acquire() 和 semaphore.release()之间的代码，同一时刻只允许制定个数的线程进入，
             * 因为semaphore的构造方法是1，则同一时刻只允许一个线程进入，其他线程只能等待。
             * */
            semaphore.acquire();

            // 将主要处理部分封装成一个方法
            doSomethingMain();

            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static String GetFormatTimeStr(){
        return sdf.format(new Date());
    }

    private static synchronized void doSomethingMain() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + ":doSomething start-" + GetFormatTimeStr());
        Thread.sleep(2000);
        System.out.println(Thread.currentThread().getName() + ":doSomething end-" + GetFormatTimeStr());
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            SemaphoreExample6 service = new SemaphoreExample6();
           /* MyThread t = new MyThread("thread" + (i + 1), service);
            t.start();// 这里使用 t.run() 也可以运行，但是不是并发执行了 */
            new Thread(new Runnable() {
                @Override
                public void run() {
                    service.doSomething();
                }
            },"thread" + (i + 1)).start();
        }
    }

}
